#ifndef REEDSOLOMON_H
#define REEDSOLOMON_H

#include <QMainWindow>

#include "../RScode/source/GFViewer/gfviewer.h"

#include "../RScode/source/superheader.h"
#include "../RScode/source/GF/gf.h"
#include "../RScode/source/Encoder/encoder.h"
#include "../RScode/source/Decoder/decoder.h"
#include "../RScode/source/Modulator/modulator.h"
#include "../RScode/source/Demodulator/demodulator.h"
#include "../RScode/source/Channel/channel.h"

namespace Ui {
class ReedSolomon;
}

class ReedSolomon : public QMainWindow
{
  Q_OBJECT

private:
  Ui::ReedSolomon *ui;

  qlonglong m_n; // длина кодового слова
  qlonglong m_k; // число информационных бит

  GF m_gf; // поле

  Encoder     m_encoder;
  Decoder     m_decoder;
  Modulator   m_modulator;
  Demodulator m_demodulator;
  Channel     m_channel;

  int m_snrBeg;  // нижняя граница SNR
  int m_snrEnd;  // верхняя граница SNR
  int m_snrStep; // шаг SNR
  int m_limErrs; // число ошибок для перехода к следующему SNR

  // выходные файлы блоков системы передачи
  QFile m_outFileSource;
  QFile m_outFileEncoder;
  QFile m_outFileDecoder;
  QFile m_outFileModulator;
  QFile m_outFileDemodulator;
  QFile m_outFileChannel;

  bool m_outFlag;   // флаг документирования
  bool m_calcGraph; // флаг остановки подсчета графика

  QFile m_outFileGraph; // файл с точками графика

  // кнопки панели инструментов
  QAction *m_ationGf;    // показ поля
  QAction *m_ationGraph; // расчет графика

  GFViewer m_gfViewer; // форма отображения поля

protected:
  QVector<QPointF> calcGraph(); // расчет графика Pe(SNR)

  void openOutFiles();      // открыть файлы всех блоков системы передачи
  void closeOutFiles();     // закрыть файлы всех блоков системы передачи
  void openOutFileGraph();  // открыть файл с точками графика
  void closeOutFileGraph(); // закрыть файл с точками графика

  // !!!!!!!!!! переименовать функции протоколирования - похоже не логарифм
  void log(QVector<qlonglong> poly, QFile *file);    // запись полинома в файл
  void log(QVector<QPointF> poly, QFile *file);      // запись точек в файл
  void logGraph(QVector<QPointF> poly, QFile *file); // запись точек графика в файл
  void generalLog(QString str);                      // запись в файлы системы передачи
                                                     // заголовка SNR

public:
  explicit ReedSolomon(qlonglong n, qlonglong k, QWidget *parent = 0);
  ~ReedSolomon();

  void createGui(); // создание графического интерфейса

protected:
  virtual void closeEvent(QCloseEvent *); // событие закрытия окна

public slots:
  void slotSnrBeg(int);  // изменение нижней границы SNR
  void slotSnrEnd(int);  // изменение верхней границы SNR
  void slotLimErrs(int); // изменение числа ошибок для перехода к следующему SNR
  void slotSnrStep(int); // изменение шага SNR

  void slotCalcGraph(); // рассчитать точки графика
  void slotViewGF();    // показать поле

  void slotAtionGraph(); // имитировать отжатие кнопки расчета графика

  void slotOutFlag(bool); // вкл/выкл документирование
};

#endif // REEDSOLOMON_H
